package net.thesocialos.client.api;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import net.thesocialos.client.CacheLayer;
import net.thesocialos.client.helper.RPCXSRF;
import net.thesocialos.client.oauth.OAuth;
import net.thesocialos.client.oauth.OAuth.JSONHandler;
import net.thesocialos.client.presenter.SocialDeckPresenter.Display;
import net.thesocialos.client.service.SocialService;
import net.thesocialos.client.service.SocialServiceAsync;
import net.thesocialos.client.view.deck.DeckColumn;
import net.thesocialos.client.view.deck.TimelinePost;
import net.thesocialos.shared.model.Account;
import net.thesocialos.shared.model.Columns;
import net.thesocialos.shared.model.Twitter;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.jsonp.client.JsonpRequestBuilder;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasWidgets;
import com.googlecode.objectify.Key;
public class TwitterAPI {
private static final SocialServiceAsync socialService = GWT.create(SocialService.class);
public class Tweet {
private String id;
private String user_id;
private String user_name;
private String screen_name;
private Date created_at;
private String profile_image_url;
private boolean user_verified;
private String text;
private String source;
/**
* @return the created_at date
*/
public Date getCreated_at() {
return created_at;
}
/**
* @return the id
*/
public String getId() {
return id;
}
/**
* @return the profile_image_url
*/
public String getProfile_image_url() {
return profile_image_url;
}
/**
* @return the screen_name
*/
public String getScreen_name() {
return screen_name;
}
/**
* @return the source
*/
public String getSource() {
return source;
}
/**
* @return the text
*/
public String getText() {
return text;
}
/**
* @return the user_id
*/
public String getUser_id() {
return user_id;
}
/**
* @return the user_name
*/
public String getUser_name() {
return user_name;
}
/**
* @return the user_verified
*/
public boolean isUser_verified() {
return user_verified;
}
}
public static Timer timer = null;
private Set<DeckColumn> deckColumns = new HashSet<DeckColumn>();
private int i = 0;
public TwitterAPI() {
// TODO Auto-generated constructor stub
}
private String getHomeTimelineSignedUrl(Twitter twitterAccount, String lastId) {
String url = "https://api.twitter.com/1/statuses/home_timeline.json";
if (null != lastId && !lastId.isEmpty()) url += "?since_id=" + lastId;
return OAuth.signRequest(Twitter.CONSUMER_KEY, Twitter.CONSUMER_SECRET, twitterAccount.getToken(),
twitterAccount.getTokenSecret(), url);
}
private String getMentionsTimelineSignedUrl(Twitter twitterAccount, String lastId) {
String url = "https://api.twitter.com/1/statuses/mentions.json";
if (null != lastId && !lastId.isEmpty()) url += "?since_id=" + lastId;
return OAuth.signRequest(Twitter.CONSUMER_KEY, Twitter.CONSUMER_SECRET, twitterAccount.getToken(),
twitterAccount.getTokenSecret(), url);
}
private String getSearchTimelineSignedUrl(Twitter twitterAccount, String query, String lastId) {
if (null == query || query.isEmpty()) return "";
if (query.contains("#")) query = query.replace("#", "%23");
String url = "https://search.twitter.com/search.json?q=" + query;
if (null != lastId && !lastId.isEmpty()) url += "&since_id=" + lastId;
return OAuth.signRequest(Twitter.CONSUMER_KEY, Twitter.CONSUMER_SECRET, twitterAccount.getToken(),
twitterAccount.getTokenSecret(), url);
}
private Twitter getTwitterAccount() {
Map<Key<Account>, Account> accounts = CacheLayer.UserCalls.getAccounts();
Iterator<Account> it = accounts.values().iterator();
while (it.hasNext()) {
Account account = it.next();
if (account instanceof Twitter) return (Twitter) account;
}
return null;
}
private String getUserTimelineSignedUrl(Twitter twitterAccount, String screen_name, String lastId) {
if (null == screen_name || screen_name.isEmpty()) screen_name = twitterAccount.getUsername();
String url = "https://api.twitter.com/1/statuses/user_timeline.json?screen_name=" + screen_name;
if (null != lastId && !lastId.isEmpty()) url += "&since_id=" + lastId;
return OAuth.signRequest(Twitter.CONSUMER_KEY, Twitter.CONSUMER_SECRET, twitterAccount.getToken(),
twitterAccount.getTokenSecret(), url);
}
public void loadColumns(final Display display, Set<Columns> columnsSet) {
final Twitter twitterAccount = getTwitterAccount();
if (null == twitterAccount) return;
if (null == deckColumns || deckColumns.isEmpty()) for (Columns c : columnsSet) {
DeckColumn col = new DeckColumn();
col.setColumns(c);
deckColumns.add(col);
display.getAllPostColumnsPanel().add(col);
col.getParent().setWidth("300px");
}
loadColumns(twitterAccount);
timer = new Timer() {
@Override
public void run() {
loadColumns(twitterAccount, display);
}
};
timer.scheduleRepeating(50000);
}
public void loadColumns(DeckColumn column) {
final Twitter twitterAccount = getTwitterAccount();
if (null == twitterAccount) return;
deckColumns.add(column);
loadColumns(twitterAccount);
}
private void loadColumns(Twitter twitterAccount, final Display display) {
Map<Key<Columns>, Columns> columns = CacheLayer.UserCalls.getColumns();
Set<Columns> columnsSet = new HashSet<Columns>(columns.values());
if (columnsSet.size() != deckColumns.size()) {
deckColumns.clear();
display.getAllPostColumnsPanel().clear();
for (Columns c : columnsSet) {
DeckColumn col = new DeckColumn();
col.setColumns(c);
deckColumns.add(col);
display.getAllPostColumnsPanel().add(col);
col.getParent().setWidth("300px");
}
}
for (DeckColumn col : deckColumns) {
Columns c = col.getColumns();
String url = "";
if (c.getType() == Columns.TYPE.TIMELINE) {
if (c.getValue().equals(Columns.HOME)) {
col.setTitle("Timeline");
new FacebookAPI().loadWall(col);
url = getHomeTimelineSignedUrl(twitterAccount, c.getLastTweetId());
} else if (c.getValue().equals(Columns.MENTIONS)) {
col.setTitle("Mentions");
url = getMentionsTimelineSignedUrl(twitterAccount, c.getLastTweetId());
} else if (c.getValue().equals(Columns.USER)) {
col.setTitle("Me");
url = getUserTimelineSignedUrl(twitterAccount, twitterAccount.getUsername(), c.getLastTweetId());
} else {
col.setTitle(c.getValue());
url = getUserTimelineSignedUrl(twitterAccount, c.getValue(), c.getLastTweetId());
}
} else if (c.getType() == Columns.TYPE.SEARCH) {
col.setTitle(c.getValue());
url = getSearchTimelineSignedUrl(twitterAccount, c.getValue(), c.getLastTweetId());
} else if (c.getType() == Columns.TYPE.LIST) col.setTitle(c.getValue());
// new TwitterAPI().loadUserTimelineInPanel(col);
loadTweetsInPanel(url, col);
// display.getAllPostColumnsPanel().add(col);
}
}
private void loadColumns(Twitter twitterAccount) {
for (DeckColumn col : deckColumns) {
Columns c = col.getColumns();
String url = "";
if (c.getType() == Columns.TYPE.TIMELINE) {
if (c.getValue().equals(Columns.HOME)) {
col.setTitle("Timeline");
new FacebookAPI().loadWall(col);
url = getHomeTimelineSignedUrl(twitterAccount, c.getLastTweetId());
} else if (c.getValue().equals(Columns.MENTIONS)) {
col.setTitle("Mentions");
url = getMentionsTimelineSignedUrl(twitterAccount, c.getLastTweetId());
} else if (c.getValue().equals(Columns.USER)) {
col.setTitle("Me");
url = getUserTimelineSignedUrl(twitterAccount, twitterAccount.getUsername(), c.getLastTweetId());
} else {
col.setTitle(c.getValue());
url = getUserTimelineSignedUrl(twitterAccount, c.getValue(), c.getLastTweetId());
}
} else if (c.getType() == Columns.TYPE.SEARCH) {
col.setTitle(c.getValue());
url = getSearchTimelineSignedUrl(twitterAccount, c.getValue(), c.getLastTweetId());
} else if (c.getType() == Columns.TYPE.LIST) col.setTitle(c.getValue());
// new TwitterAPI().loadUserTimelineInPanel(col);
loadTweetsInPanel(url, col);
// display.getAllPostColumnsPanel().add(col);
}
}
public synchronized void loadHomeTimelineInPanel(final HasWidgets panel) {
int j = i++;
Twitter twitterAccount = getTwitterAccount();
if (null == twitterAccount) return;
String url = "https://api.twitter.com/1/statuses/home_timeline.json";
url = OAuth.signRequest(Twitter.CONSUMER_KEY, Twitter.CONSUMER_SECRET, twitterAccount.getToken(),
twitterAccount.getTokenSecret(), url);
loadTweetsInPanel(url, panel, j);
}
private void loadTweetsInPanel(String url, final DeckColumn panel) {
JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
jsonp.requestObject(url, new AsyncCallback<JavaScriptObject>() {
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
}
@Override
public void onSuccess(JavaScriptObject result) {
JSONArray array;
Columns c = panel.getColumns();
if (c.getType() == Columns.TYPE.SEARCH) {
JSONObject json = new JSONObject(result);
array = json.get("results").isArray();
} else
array = new JSONArray(result);
Set<Tweet> tweets = new HashSet<Tweet>();
for (int i = 0; i < array.size(); i++) {
Tweet tweet = new Tweet();
tweet.id = array.get(i).isObject().get("id").isNumber().toString();
if (c.getType() == Columns.TYPE.SEARCH) {
tweet.user_id = array.get(i).isObject().get("from_user_id").isNumber().toString();
tweet.user_name = array.get(i).isObject().get("from_user_name").isString().stringValue();
tweet.screen_name = array.get(i).isObject().get("from_user").isString().stringValue();
tweet.profile_image_url = array.get(i).isObject().get("profile_image_url").isString()
.stringValue();
} else {
JSONObject user = array.get(i).isObject().get("user").isObject();
tweet.user_id = user.get("id").isNumber().toString();
tweet.user_name = user.get("name").isString().stringValue();
tweet.screen_name = user.get("screen_name").isString().stringValue();
tweet.profile_image_url = user.get("profile_image_url").isString().stringValue();
tweet.user_verified = user.get("verified").isBoolean().booleanValue();
}
tweet.created_at = new Date(array.get(i).isObject().get("created_at").isString().stringValue());
tweet.text = array.get(i).isObject().get("text").isString().stringValue();
tweet.source = array.get(i).isObject().get("source").isString().stringValue();
// panel.addTweet(tweet);
tweets.add(tweet);
}
Set<Tweet> oldTweets = panel.getTweets();
if (null != oldTweets && !oldTweets.isEmpty()) tweets.addAll(tweets);
else
panel.setTweets(tweets);
// panel.clearTweets();
panel.loadAll();
}
});
/*
* OAuth.makeJSONRequest(j, url, new JSONHandler() {
* @Override public void handleJSON(JavaScriptObject obj) { } });
*/
}
private synchronized void loadTweetsInPanel(String url, final HasWidgets panel, int j) {
OAuth.makeJSONRequest(j, url, new JSONHandler() {
@Override
public void handleJSON(JavaScriptObject obj) {
JSONArray array = new JSONArray(obj);
for (int i = 0; i < array.size(); i++) {
Tweet tweet = new Tweet();
tweet.id = array.get(i).isObject().get("id").isNumber().toString();
JSONObject user = array.get(i).isObject().get("user").isObject();
tweet.user_id = user.get("id").isNumber().toString();
tweet.user_name = user.get("name").isString().stringValue();
tweet.screen_name = user.get("screen_name").isString().stringValue();
tweet.created_at = new Date(array.get(i).isObject().get("created_at").isString().stringValue());
tweet.profile_image_url = user.get("profile_image_url").isString().stringValue();
tweet.user_verified = user.get("verified").isBoolean().booleanValue();
tweet.text = array.get(i).isObject().get("text").isString().stringValue();
tweet.source = array.get(i).isObject().get("source").isString().stringValue();
panel.add(new TimelinePost(tweet));
}
}
});
}
public void post(final String message) {
final Twitter twitterAccount = getTwitterAccount();
new RPCXSRF<String>(socialService) {
@Override
public void onFailure(Throwable caught) {
caught.printStackTrace();
}
@Override
public void onSuccess(String result) {
// Window.alert(result);
timer.schedule(1000);
}
@Override
protected void XSRFcallService(AsyncCallback<String> cb) {
socialService.tweet(twitterAccount, message, cb);
}
}.retry(3);
}
/*
* int j = i++; if (i == 100) i = 0; String url =
* "https://api.twitter.com/1/statuses/update.json?callback=jsonCallback[" + j + "]"; url =
* OAuth.signPostRequest(Twitter.CONSUMER_KEY, Twitter.CONSUMER_SECRET, twitterAccount.getToken(),
* twitterAccount.getTokenSecret(), url, message); postTweet(url, j); } private void postTweet(String url, int j) {
* OAuth.makeJSONRequest(j, url, new JSONHandler() {
* @Override public void handleJSON(JavaScriptObject obj) { JSONObject js = new JSONObject(obj);
* Window.alert(js.toString()); } }); }
*/
public synchronized void loadUserTimelineInPanel(final HasWidgets panel) {
int j = i++;
Twitter twitterAccount = getTwitterAccount();
if (null == twitterAccount) return;
String url = "https://api.twitter.com/1/statuses/user_timeline.json?screen_name="
+ twitterAccount.getUsername() + "&callback=jsonCallback[" + j + "]";
url = OAuth.signRequest(Twitter.CONSUMER_KEY, Twitter.CONSUMER_SECRET, twitterAccount.getToken(),
twitterAccount.getTokenSecret(), url);
loadTweetsInPanel(url, panel, j);
}
protected void send(String Url, RequestCallback cb) {
/*
* JsonpRequestBuilder jsonp = new JsonpRequestBuilder(); jsonp.setTimeout(10000); jsonp.requestObject(Url, cb);
*/
RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, Url);
builder.setTimeoutMillis(10000);
builder.setCallback(cb);
Request req = null;
try {
req = builder.send();
} catch (RequestException e) {
cb.onError(req, e);
}
}
}